//
//  Emoticon.swift
//  04CZemoticon
//
//  Created by ksl on 15/12/6.
//  Copyright © 2015年 ksl. All rights reserved.
//

import UIKit

///表情包模型
class EmoticonPackage: NSObject {
    
    //表情包对应的文件夹名称
    var id: String?
    
    //表情包名称
    var group_name_cn: String?
    
    ///表情模型数组
    var emoticons = [Emoticon]()
    
    ///字典转模型
    init(id: String) {
        self.id = id
        super.init()
    }
    
    // 字典的key在模型中找不到对应的属性, 特别注意 不要写错方法
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    override var description: String {
        
        return "\n\t: 表情包模型: id: \(id), group_name_cn: \(group_name_cn), emoticons: \(emoticons)"
    }
    
    //获取emoticons.bundle 的路径
    private static let bundlePath = NSBundle.mainBundle().pathForResource("Emoticons", ofType: "bundle")!
    
    //加载表情包
    class func loadPackage() -> [EmoticonPackage]{
        //获取 emoticons.plist的路径 = bundlePath + "/emoticons.plist"
        let plistPath = (bundlePath as NSString).stringByAppendingPathComponent("emoticons.plist")
        
        //获取 emoticons.plist内容
        let emoticonsDict = NSDictionary(contentsOfFile: plistPath)!
        print("emoticonsDict: \(emoticonsDict)")
        
        //获取表情包文件夹名称 [Int] [[String: AnyObject]]: 数组里面的元素是字典
        let packageArr = emoticonsDict["packages"] as! [[String: AnyObject]]
        
        //存放表情包模型的数组
        var packages = [EmoticonPackage]()
        
        //创建"最近"表情包
        let recentPackages = EmoticonPackage(id: "")
        
        //设置表情包名称
        recentPackages.group_name_cn = "最近"
        
        //追加 20-个空表情和一个删除按钮
        recentPackages.appendEmptyEmoticon()
        
        //添加到表情包
        packages.append(recentPackages)

        //遍历获取每一个表情包文件名称
        for dict in packageArr {
            //获取 id
            let id = dict["id"] as! String
            
            //创建表情包
            let package = EmoticonPackage(id: id)
            
            //根据当前表情包模型,加载表情包名称和所有的表情模型
            package.loadEmoticon()

            packages.append(package)
        }
        
        //返回加载到的表情包模型
        return packages
    }
    
    ///根据当前表情包模型,加载表情包名称和所有的表情模型
    func loadEmoticon() {
        //获取对应表情包模型里面的 info.plist = bundlePath + 表情包文件夹名称 + info.plist
        let infoPlist = EmoticonPackage.bundlePath + "/\(id!)" + "/info.plist"
        
        //把 infoPlistr 的内容加载到内存
        let infoDict = NSDictionary(contentsOfFile: infoPlist)!
        
        //获取到表情包名称
        group_name_cn = infoDict["group_name_cn"]  as! String
        
        //获致表情包里面的所有表情模型
        let emoticonArr = infoDict["emoticons"] as! [[String: AnyObject]]
        
        //记录
        var index = 0
        
        //遍历emoticonArr数组,生成表情模型
        for dict in emoticonArr {
            //字典转模型
            let emoticon = Emoticon(id: id!, dict: dict)
            emoticons.append(emoticon)
            
            index++
            
            //判断,如果是每一页的最后一个,添加一个删除按钮
            if index == 20 {//一页的最后一个
                //创建删除按钮
                let removeEmoticon = Emoticon(removeEmoticon: true)
                
                //添加到表情模型数据
                emoticons.append(removeEmoticon)
                
                //清空 index
                index = 0
                
            }
        }
        
        //表情包加载完成,来判断最后一页,是否够 21 个按钮,不够的话,填充空白按钮,并在最后添加一个删除按钮
        appendEmptyEmoticon()
    }
    
        /// 填充空白按钮,并在最后添加一个删除按钮
    func appendEmptyEmoticon() {
        //判断,这个表情包最后一页有多少个按钮
        //count = 0 正好满一页
        let count = emoticons.count % 21
        // 当是 `最近` 表情包时, emoticons.count 数量是等于0, count也等于0,进入不了追加表情,从bundle加载的表情 emoticons.count不等于0
        // emoticons.count == 0表示`最近` 表情包
        if count > 0 || emoticons.count == 0 {//表示最后一页没有满 21 个 按钮,只有 count 个
            // 追加多少个空白按钮
            // count == 1, 需要追加19(20 - 1)(count..<20)个空白按钮和一个删除按钮
            // count == 2, 需要追加18(20 - 2)(count..<20)个空白按钮和一个删除按钮
            for _ in count..<20 {
                //创建空白按钮
                let emptyEmoticon = Emoticon(removeEmoticon: false)
                
                //添加到表情模型数据 
                emoticons.append(emptyEmoticon)
            }
            
            //追加一个删除按钮
            emoticons.append(Emoticon(removeEmoticon: true))
            
        }
        
    }
}

///表情模型
class Emoticon: NSObject {
    
    //表情包文件夹名称
    var id: String?

    //表情传输名称 
    var chs: String?
    
    //表情对应的图片
    var png: String? {
        didSet {
            //计算图片的完整路径 = bundlePath + 表情包文件夹名称 + 图片名称
            pngPath = EmoticonPackage.bundlePath + "/\(id!)" + "/\(png!)"
        }
    }
    
    //图片的完整路径
    var pngPath: String?
    
    //code emoji 的 16 进制字符串
    var code: String? {
        didSet {
            // 扫描
            let scanner = NSScanner(string: code!)
            
            // result: UnsafeMutablePointer<UInt32>: UInt32指针
            var result: UInt32 = 0
            
            // 将结果赋值给result
            scanner.scanHexInt(&result)
            
            let char = Character(UnicodeScalar(result))
            
            //把 code 转成 emoji 表情
            emoji = "\(char)"
        }
    }
    
    //emoji 表情
    var emoji: String?
    
    //false 表示空表情,true 表示删除按钮
    var removeEmoticon = false
    //空表情和删除按钮都不需要其他属性
    init(removeEmoticon: Bool) {
        self.removeEmoticon = removeEmoticon
        super.init()
    }
    
    ///字典转模型
    init(id: String, dict: [String: AnyObject]) {
        self.id = id
        super.init()
        
        //KVC 字典转模型
        setValuesForKeysWithDictionary(dict)
    }
    
    // 字典的key在模型中找不到对应的属性, 特别注意 不要写错方法
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    override var description: String {
        return "\n\t\t: 表情模型: chs: \(chs), png: \(png), code: \(code)"
    }
}
